Note 1有提到,這次的IOT玩具我想要做自動澆花工具,所以必須有一個控制水流的開關才行。比較直覺的方法有:
去電料行逛了一下,最後選擇第二個方法,買了servo motor!因為我是學軟體的,連電子學都沒修過,所以找了比較懂的朋友一起(幫我)買。
因為不知servo motor是啥東西,先來看篇教學文。
總之,要控制servo motor需要輸入50Hz方波給它,且這個方波需要可以調整Pulse Width。還好SDK也有example了,直接拿來設定一下參數就好。
範例路徑:project/realtek_amebaz2_v0_example/example_sources/pwm
上一篇已經成功用http POST控制LED了,現在我們一樣用http POST來控制servo motor。
因為只是測試,所以先直接把code直接寫在同樣的位置 component/common/example/httpd/example_httpd.c ,之後再來整理吧!
#define PWM_7 PA_13 // servo motor PWM pin接A13,另外還要接5V和GND
#define PWM_PERIOD 20000 // 20000us = 0.02s = 50Hz
// http POST之後執行的function
void test_post_cb(struct httpd_conn *conn) // 目前測試先寫在這個function,之後為了coding style的可讀和維護性,要重新寫過才行!
{
// 中間略
// PWM
uint8_t pwm_width_idx = body[strlen((char const*)body)-1]; // 一樣使用POST data的最後一個char (到底多不想parsing string?)
if ((pwm_width_idx >= 48) && // '0'
(pwm_width_idx <= 57) ) { // '9'
pwm_width_idx -= 48; // 0 ~ 9 (連string to int都懶?)
printf("[HANA] PWM width index %d\n", pwm_width_idx); // pwm_width_idx是0~9的數字
//pwmout_pulsewidth_us(&pwm_motor, (int)(500 + pwm_width_idx*150)); // 500us(0.5ms)~2000us(2ms) maps to -90 ~ +90 degree // 根據spec,每個pwm_width_id的間距應該要是150
pwmout_pulsewidth_us(&pwm_motor, (int)(500 + pwm_width_idx*190)); // 500us(0.5ms)~2000us(2ms) maps to -90 ~ +90 degree // 但是經過測試,間距要設為190才可以達到180度的轉度
// 入口點
static void example_httpd_thread(void *param)
{
// 中間略
// Init PWM output pin
pwmout_init(&pwm_motor, (PinName)PWM_7);
pwmout_period_us(&pwm_motor, PWM_PERIOD);
大概就是這樣~~